// src/api/axios.js

import axios from 'axios';
import { message } from 'ant-design-vue';

const apiClient = axios.create({
  baseURL: 'http://localhost:9999/api',
  headers: {
    'Content-Type': 'application/json',
  },
});

/**
 * 请求拦截器
 * 【核心修正】我们不再从 Pinia store 获取 token，而是直接从 localStorage 读取。
 * 这样做的好处是：
 * 1. 完全解耦：apiClient 不再依赖 Pinia，避免了所有跨模块状态管理的问题。
 * 2. 更加可靠：localStorage 是一个全局的、同步的存储，只要登录时成功存入，这里就一定能读到。
 */
apiClient.interceptors.request.use(
  (config) => {
    // 直接从 localStorage 读取 token
    const token = localStorage.getItem('token');
    
    if (token) {
      // 如果 token 存在，则添加到请求头
      config.headers.Authorization = `Bearer ${token}`;
    }
    
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * 响应拦截器
 * 用于处理全局的响应错误，例如 token 过期导致的 401 错误。
 */
apiClient.interceptors.response.use(
  (response) => response,
  async (error) => {
    const originalRequest = error.config; 
    // 检查是否有响应体
    if (error.response) {
      const { status, data } = error.response;
      
      // Case 1: Token 失效或未认证 (401)
      if (status === 401 && originalRequest.url !== '/auth/login') {
        const { useAuthStore } = await import('@/stores/auth');
        const authStore = useAuthStore();
        
        message.error('您的登录已过期，请重新登录。');
        authStore.logout();
        window.location.href = '/login';
        
        // 返回一个永远不会 resolve 的 Promise，中断后续的 .catch
        return new Promise(() => {}); 
      }
      
      // Case 2: 其他业务错误（如 400, 404, 500 等）
      // 后端可以返回类似 { message: "错误信息" } 的结构
      if (data && data.message) {
        // 将后端的业务错误信息赋值给 error 对象，方便组件层获取
        error.message = data.message;
      }
      
    } else if (error.request) {
      // Case 3: 请求已发出，但没有收到响应 (例如网络断开，后端服务挂了)
      error.message = '网络错误，无法连接到服务器。';
      message.error(error.message);
    } else {
      // Case 4: 在设置请求时触发了错误
      error.message = '请求设置时发生错误。';
    }
    
    // 将处理过的错误继续抛出，让组件的 catch 块可以接收到
    return Promise.reject(error);
  }
);

export default apiClient;